package com.baosight.risk.api.fltd;

import com.baosight.risk.service.fltd.vo.FlaaNodeAuthoVO;
import com.baosight.risk.service.fltd.vo.FltdTaskVO;
import com.baosight.risk.service.fltd.vo.NodeTransitionVO;
import com.baosight.risk.service.xtzy.entity.XtzyUser;

import java.util.List;
import java.util.Map;

/**
 * 作者： lishaoqing
 * 时间： 2019年07月17日
 * 描述： FlaaNodeAuthoService
 * 版本: v1.0
 */
public interface FlaaNodeAuthoService {

    /**
     * 新增流程授权规则
     *
     * @param auths    授权对象
     * @param userCode 当前登录用户
     */
    void save(List<FlaaNodeAuthoVO> auths, String userCode) throws Exception;

    /**
     * 清理现有的授权规则
     * @param nodes 授权对象
     *
     */
    void cleanNodes(List<FlaaNodeAuthoVO> nodes) throws Exception;

    /**
     * 更新流程授权规则
     *
     * @param nodes    授权对象
     * @param userCode 当前登录用户
     */
    void update(List<FlaaNodeAuthoVO> nodes, String userCode) throws Exception;

    /**
     * 根据流程编码查询授权关系
     *
     * @param flowNo 流程编码
     * @return 授权关系
     */
    List<FlaaNodeAuthoVO> selectNodesByFlowNo(String flowNo);

    /**
     * 查询指定节点授权信息
     *
     * @param flowNo   流程编码
     * @param nodeCode 节点编码
     * @return 授权信息
     */
    FlaaNodeAuthoVO selectNodeInfo(String flowNo, String nodeCode);

    /**
     * 查询开始节点的下一个节点的授权信息
     *
     * @param flowNo   流程编码
     * @param nodeType 节点类型
     * @return 授权信息
     */
    FlaaNodeAuthoVO selectFirstNode(String flowNo, String nodeType);

    /**
     * 查询指定节点及下一个节点的授权信息
     *
     * @param processDefId 流程定义id, 为空则取最新的流程定义id
     * @param flowNo       流程编码
     * @param nodeCode     节点编码
     * @return 授权信息
     */
    FlaaNodeAuthoVO selectNextNode(String processDefId, String flowNo, String nodeCode);

    /**
     * 查询指定节点的下一个节点及转移路线
     *
     * @param processDefId 流程定义id
     * @param nodeCode     节点编码
     * @return 查询结果
     */
    List<NodeTransitionVO> selectNextNodeTransition(String processDefId, String nodeCode);

    /**
     * 查询指定节点的转移路线
     *
     * @param processDefId 流程定义id
     * @param nodeCode     节点编码
     * @return 查询结果
     */
    List<NodeTransitionVO> selectTransition(String processDefId, String nodeCode);

    /**
     * 查询转移线指定的节点
     *
     * @param transitionDefId 转移线id
     * @return 查询结果
     */
    NodeTransitionVO selectTransitionById(String transitionDefId,String processDefId);

    /**
     * 获取流程转移路径
     *
     * @param taskVO 流程任务vo
     * @return 流程转移路径
     */
    Map<String, Object> getTransitionButton(FltdTaskVO taskVO);

    /**
     * 获取下一节点审批人
     *
     * @param taskVO      流程任务vo
     * @param currentUser 当前用户
     * @return 流程转移路径
     */
    Map<String, Object> getNextUser(FltdTaskVO taskVO, XtzyUser currentUser) throws Exception;

    /**
     * 获取下一节点审批人，包含多个分支的人员
     *
     * @param taskVO      流程任务vo
     * @param currentUser 当前用户
     * @return 流程转移路径
     */
    Map<String, Object> getNextUserBranch(FltdTaskVO taskVO, XtzyUser currentUser) throws Exception;

    /**
     * 查询结束节点
     *
     * @param processDefId 流程定义id
     * @param nodeType     节点类型
     * @return 查询结果
     */
    NodeTransitionVO selectNodeByType(String processDefId, String nodeType);

    /**
     * 查询指定节点授权用户
     *
     * @param nodeInfo    节点vo
     * @param currentUser 当前用户
     * @param taskVO      待办任务vo
     * @return 授权用户
     */
    Map<String, Object> getUsersByNodeInfo(FlaaNodeAuthoVO nodeInfo, XtzyUser currentUser, FltdTaskVO taskVO) throws Exception;

    /**
     * 开始节点授权验证
     *
     * @param taskVO 流程任务vo
     * @return 验证结果
     */
    Map<String, Object> validStart(FltdTaskVO taskVO, XtzyUser user);


}
